#ifndef _FORWARDLIST_H_
#define _FORWARDLIST_H_
#include <stdio.h>
/* 上面的 define 是防止在编译时多次包含 forwardlist.h 文件 */

/* 链表的数据类型 */
struct student
{
    long long ID;
    char name[16];
    char sex[16];
};


typedef struct student DYMFListDataType;

/* 单链表的节点 */
struct _list_node
{
    DYMFListDataType data;
    struct _list_node * next;
};

/* 单链表 */
typedef struct _forward_list
{
    size_t size;                // 链表中已有元素数量
    struct _list_node *buff;    // 指向链表中第一个元素，或者为空    
} DYMFList;

/*  函数功能：创建单链表,并返回
    return ：创建好的单链表 
*/
DYMFList DYMFListCreate();

/*  函数功能：向链表 list 中添加一个元素 elem
    @param list: 待操作链表
    @param elem: 待添加的元素
    return ：操作成功返回1，失败返回0（有可能申请空间失败，或者其它情况导致插入失败，返回0）
*/
int DYMFListAdd(DYMFList *list, DYMFListDataType elem);

/*  函数功能：从链表 list 中删除所有值为 elem 的元素
    @param list: 待操作链表
    @param elem: 待添加的元素
    @param equal: 因为要删除所有值为 elem 的元素，所以我们需要提供一个比较函数来比较 elem， equal 函数在 a == b时返回1，a != b 时返回 0, 若 equal 传入NULL，那么我们使用 == 来替代 equal 函数
    return ：操作成功返回1，失败返回0（链表可能并不存在该元素）
*/
int DYMFListDelete(DYMFList *list, DYMFListDataType elem, int (*equal)(DYMFListDataType *a, DYMFListDataType *b));


/*  函数功能：查找链表 list 中是否有值为 elem 的元素
    @param list: 待操作链表
    @param elem: 待添加的元素
    @param equal: 因为要查找值为 elem 的元素，所以我们需要提供一个比较函数来比较 elem，equal 函数在 a == b 时返回 1，a != b 时返回 0, 若 equal 传入NULL，那么我们使用 == 来替代 equal 函数
    return ：操作成功返回 1 ，失败返回 0
*/
int DYMFListFind(DYMFList *list, DYMFListDataType elem, int (*equal)(DYMFListDataType *a, DYMFListDataType *b));

/*  函数功能：销毁单链表 list
    @param list: 待操作链表
*/
void DYMFListDectory(DYMFList *list);


/* 下面是实现好的一些使用函数 */
/*
    函数功能：遍历链表所有元素，并执行传入的 hook 函数，hook 函数参数被自动填入每个节点的值。
*/
void DYMListForeach(DYMFList *list, void (*hook)(DYMFListDataType *elem));

#endif // _FORWARDLIST_H_